package com.biao.hashmap;

import java.util.HashMap;
import java.util.Map;

public class Demo10_HashMap_parameter {

    // 初始容量
    static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16
    // 最大容量 1073741824
    static final int MAXIMUM_CAPACITY = 1 << 30;
    // 加载因子 如：初始容量扩容 16 * 0.75 = 12，达到12就开始做扩容
    static final float DEFAULT_LOAD_FACTOR = 0.75f;
    /*
        提前做扩容：
        1.	如果加载因子越大，空间利用率比较高，有可能冲突概率越大；
        2.	如果加载因子越小，有可能冲突概率比较小，空间利用率不高；
        空间和时间上平衡点：0.75
        统计学概率：泊松分布是统计学和概率学常见的离散概率分布
     */


    // 链表大于8转成红黑树
    static final int TREEIFY_THRESHOLD = 8;
    // 链表元素降低6情况下转为链表
    static final int UNTREEIFY_THRESHOLD = 6;
    // 初始时候数组容量大于64，再判断链表长度大于8转成红黑树
    static final int MIN_TREEIFY_CAPACITY = 64;

    /*
    HashMap如何存放1万条key效率最高？
        initialCapacity = (需要存储的元素个数 / 负载因子) + 1
        10000/0.75+1=13334
        正常如果存放1万个key的情况下 大概扩容10次=16384
     */

    /*
    static class Node<K,V> implements Map.Entry<K,V> {
        // 这些元素表示单向链表
        final int hash;     // 保存hash是为了方便扩容时候计算在新的table中index的值
        final K key;
        V value;
        HashMap.Node<K, V> next;
    }
     */

    // transient 关键字表示不能序列化
//    transient HashMap.Node<K,V>[] table;
    transient int size;
    // modCount 作用： 遍历HashMap集合时防止多线程篡改数据
    transient int modCount;
    // 加载因子
//    final float loadFactor;

}
